제3 고지 : 고차 미분 계산¶

STEP 35 : 고차 미분 계산 그래프¶

$$ y=\tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} $$

이번 단계에서는 쌍곡탄젠트 또는 하이퍼볼릭 탄젠트 라 불리는 $\tanh$ 를 구현한다.

35.1 tanh 함수 미분¶

$\tanh(x)$ 함수의 미분은 다음의 Quotient Differentiation Rule 을 이용한다.

이때, $\frac{\partial e^x}{\partial x} = e^x,\frac{\partial e^{-x}}{\partial x} = -e^{-x}$ 임을 이용하면 다음과 같이 미분할 수 있다.

$$ \therefore \frac{\partial \tanh(x)}{\partial x} = 1-y^2\\ $$

35.2 tanh 함수 구현¶

앞서 구한 미분 결과를 바탕으로 Tanh를 구현해보자.

In [ ]:
import sys

sys.path.append("..")

import numpy as np
from dezero.core import Function


class Tanh(Function):
    def forward(self, x):
        y = np.tanh(x)
        return y

    def backward(self, gy):
        y = self.outputs[0]()
        gx = gy * (1 - y**2)
        return gx


def tanh(x):
    return Tanh()(x)

35.3 고차 미분 계산 그래프 시각화¶

구현된 Tanh를 바탕으로 고차미분 계산그래프를 시각화 해보자. 다음은 반복해서 역전파함으로 써 고차미분을 계산하고 생성된 계산 그래프를 시각화 하는 코드이다.

In [ ]:
import numpy as np
from dezero import Variable
from dezero.utils import plot_dot_graph
import dezero.functions as F

x = Variable(np.array(1.0))
y = F.tanh(x)
x.name = 'x'
y.name = 'y'
y.backward(create_graph=True)

# TODO: n=2,3,4 로 바꿔가며 확인해보자.
iters = 5

for i in range(iters):
    gx = x.grad
    x.cleargrad()
    gx.backward(create_graph=True)

gx = x.grad
gx.name = 'gx' + str(iters + 1)
plot_dot_graph(gx, verbose=False, to_file='tanh.png')
Out[ ]: